查看原文
其他

Kafka ISR 副本同步机制

张乘辉 后端进阶 2022-07-07

ISR(in-sync replica) 就是 Kafka 为某个分区维护的一组同步集合,即每个分区都有自己的一个 ISR 集合,处于 ISR 集合中的副本,意味着 follower 副本与 leader 副本保持同步状态,只有处于 ISR 集合中的副本才有资格被选举为 leader。一条 Kafka 消息,只有被 ISR 中的副本都接收到,才被视为“已同步”状态。这跟 zk 的同步机制不一样,zk 只需要超过半数节点写入,就可被视为已写入成功。

follwer 副本与 leader 副本之间的数据同步流程如下:

从上图可看出,leader 的 remote LEO 的值相对于 follower LEO 值,滞后一个 follower RPC 请求,remote LEO 决定 leader HW 值的大小,详情请看「图解:Kafka 水印备份机制」。

这也就意味着,leader 副本永远领先 follower 副本,且各个 follower 副本之间的消息最新位移也不尽相同,Kafka 必须要定义一个落后 leader 副本位移的范围,使得处于这个范围之内的 follower 副本被认为与 leader 副本是处于同步状态的,即处于 ISR 集合中。

(1)0.9.0.0 版本之前的设计

0.9.0.0 版本之前判断副本之间是否同步,主要是靠参数 replica.lag.max.messages 决定的,即允许 follower 副本落后 leader 副本的消息数量,超过这个数量后,follower 会被踢出 ISR。

replica.lag.max.messages 也很难在生产上给出一个合理值,如果给的小,会导致 follower 频繁被踢出 ISR,如果给的大,broker 发生宕机导致 leader 变更时,肯能会发生日志截断,导致消息严重丢失的问题。

可能你会问,给个适中的值不就行了吗?关键在这里,怎样才是适中?如何界定?

假设现在某个 Kafka 集群追求高吞吐量,那生产者的 batch.size 就会设置得很大,每次发送包含的消息量很多,使消息发送的吞吐量大大提高,如果此时 min.insync.replicas=1,从上图可看出,生产者发送消息保存到 leader 副本后就会响应成功,表示许诺用户保存到至少一个副本的要求已经达到,消息已经成功发送。那问题来了,由于 follower 副本同步 leader 副本的消息是不断地发送 fetch 请求,此时如果 leader 一下子接收到很多消息,就会导致 leader 副本与 follower 副本的消息数量相差很大,如果此时这个差数大于 replica.lag.max.messages 的值,follower 副本就会被踢出 ISR,因此,该集群需要把 replica.lag.max.messages 的值设置成很大才能够避免 follower 副本频繁被踢出 ISR。

所以说,replica.lag.max.messages 的设计是有缺陷的,当生产者发送消息量很大时,该值也需要相应调大,但就会造成消息严重丢失的风险。

有没有更好的解决方案?

(2)0.9.0.0 版本之后的设计

在 0.9.0.0 版本之后,Kafka 给出了一个更好的解决方案,去除了 replica.lag.max.messages,,用 replica.lag.time.max.ms 参数来代替,该参数的意思指的是允许 follower 副本不同步消息的最大时间值,即只要在 replica.lag.time.max.ms 时间内 follower 有同步消息,即认为该 follower 处于 ISR 中,这就很好地避免了在某个瞬间生产者一下子发送大量消息到 leader 副本导致该分区 ISR 频繁收缩与扩张的问题了。


近期热文

我对支付平台架构设计的一些思考

分布式事务中间件Seata的设计原理

聊聊Tomcat的架构设计

图解:Kafka 水印备份机制

记一次 Kafka 集群线上扩容

Kafka消息体大小设置的一些细节

RocketMQ为什么要保证订阅关系的一致性?

RocketMQ消息发送的高可用设计

深度解析RocketMQ Topic的创建机制

RocketMQ源码分析之路由中心

实战|如何自定义SpringBoot Starter?

Mybatis-spring源码分析之注册Mapper Bean

从源码的角度解析线程池运行原理

关于线程池你不得不知道的一些设置

你都理解创建线程池的参数吗?

Java并发之AQS源码分析(二)

Java并发之AQS源码分析(一)


长按可以订阅

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存